home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / cpp_libs / awe2-0_1.lha / awe2-0.1 / Documentation / trees.tex < prev   
Text File  |  1988-07-02  |  3KB  |  118 lines

  1. %
  2. %    Tree in TeX, from TUGboat, Vol 6 (1985) No 1, by David Epstein
  3. %
  4. %
  5. %    Part one, internal storage of the tree structure
  6. %
  7. \newbox\treebox
  8. \def\tree{\global\setbox\treebox=\boxtree}
  9. \def\subtree{\ettext \boxtree}
  10. \def\leaf#1{\subtree#1\endsubtree}
  11. \def\endsubtree{\ettext \egroup}
  12. \def\endtree{\endsubtree \settreesizes \typesettree}
  13. %
  14. \newif\iftreetext\treetextfalse
  15. \def\boxtree{\hbox\bgroup
  16.   \baselineskip 2.5ex
  17.   \tabskip 0pt
  18.   \vbox\bgroup
  19.   \treetexttrue
  20.   \let\par\crcr \obeylines
  21.   \halign\bgroup##\hfil\cr}
  22. \def\ettext{\iftreetext
  23.   \crcr\egroup \egroup \fi}
  24. %
  25. %    List functions
  26. %
  27. \def\cons#1#2{\edef#2{\xmark #1#2}}
  28. \def\car#1{\expandafter\docar#1\docar}
  29. \def\docar\xmark#1\xmark#2\docar{#1}% this is an elaborate pattern, not a typo
  30. \def\cdr#1{\expandafter\docdr#1\docdr#1}
  31. \def\docdr\xmark#1\xmark#2\docdr#3{\def#3{\xmark #2}}
  32. \def\xmark{\noexpand\xmark}
  33. \def\nil{\xmark}
  34. %
  35. %    Part two, calculating sizes at each level
  36. %
  37. \def\settreesizes{\setbox0=\copy\treebox \global\let\treesizes\nil \setsizes}
  38. \newdimen\treewidth
  39. \def\setsizes{\setbox0=\hbox\bgroup
  40.   \unhbox0\unskip
  41.   \inittreewidth
  42.   \sizesubtrees
  43.   \sizelevel
  44.   \egroup}
  45. %
  46. \def\inittreewidth{\ifx\treesizes\nil
  47.   \treewidth=0pt
  48. \else \treewidth=\car\treesizes
  49.   \global\cdr\treesizes
  50.   \fi}
  51. \def\sizesubtrees{\loop
  52.   \setbox0=\lastbox \unskip
  53.   \ifhbox0 \setsizes
  54.   \repeat}
  55. \def\sizelevel{\ifdim\treewidth<\wd0
  56.     \treewidth=\wd0 \fi
  57.   \global\cons{\the\treewidth}\treesizes}
  58. %
  59. %    Part three
  60. %
  61. \newdimen\treeheight
  62. \newif\ifleaf
  63. \newif\ifbotsub
  64. \newif\iftopsub
  65. \def\typesettree{\medskip \maketree \medskip}
  66. \def\maketree{\hbox{\treewidth=\car\treesizes
  67.   \cdr\treesizes
  68.   \makesubtreebox\unskip
  69.   \ifleaf \makeleaf
  70.   \else \makeparent \fi}}
  71. %
  72. {\catcode`@=11
  73.  \gdef\makesubtreebox{\unhbox\treebox
  74.    \unskip\global\setbox\treebox\lastbox
  75.   \ifvbox\treebox
  76.     \global\leaftrue \let\next\relax
  77.   \else \botsubtrue
  78.     \setbox0\box\voidb@x
  79.     \botsubtrue \let\next\makesubtree
  80.   \fi \next}}
  81. %
  82. \def\makesubtree{\setbox1\maketree
  83.   \unskip\global\setbox\treebox\lastbox
  84.   \treeheight=\ht1
  85.   \advance\treeheight 2ex
  86.   \ifhbox\treebox \topsubfalse
  87.     \else \topsubtrue \fi
  88.   \addsubtreebox
  89.   \iftopsub \global\leaffalse
  90.     \let\next\relax \else
  91.     \botsubfalse \let\next\makesubtree
  92.   \fi \next}
  93. %
  94. \def\addsubtreebox{\setbox0=\vbox{\subtreebox\unvbox0}}
  95. \def\subtreebox{\hbox\bgroup
  96.   \vbox to \treeheight\bgroup
  97.     \ifbotsub \iftopsub \vfil
  98.         \hrule width 0.4pt
  99.       \else \treehalfrule \fi \vfil
  100.     \else \iftopsub \vfil \treehalfrule
  101.       \else \hrule width 0.4pt height \treeheight \fi\fi
  102.     \egroup
  103.   \treectrbox{\hrule width 1em}\hskip 0.2em\treectrbox{\box1}\egroup}
  104. %
  105. \def\treectrbox#1{\vbox to \treeheight{\vfil #1\vfil}}
  106. \def\treehalfrule{\dimen0=\treeheight
  107.   \divide\dimen0 2\advance\dimen0 0.2pt
  108.   \hrule width 0.4pt height \dimen0}
  109. %
  110. \def\makeleaf{\box\treebox}
  111. \def\makeparent{\ifdim\ht\treebox>\ht0
  112.     \treeheight=\ht\treebox
  113.   \else \treeheight=\ht0 \fi
  114.   \advance\treewidth-\wd\treebox
  115.   \advance\treewidth 1em
  116.   \treectrbox{\box\treebox}\hskip 0.2em
  117.   \treectrbox{\hrule width \treewidth}\treectrbox{\box0}}
  118.